package tour.board.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import board.util.Utilities;
import tour.board.dao.CmBoardDAO;
import tour.board.to.CmBoard;
import tour.board.to.PagingBean;
import tour.board.to.RecommendTO;


import tour.board.to.ReCmBoard;
 

@Service
public class CmBoardServiceImpl implements CmBoardService{
	
	@Autowired
	private CmBoardDAO cmBoardDAO;

	

	public void setBoardDAO(CmBoardDAO cmBoardDAO) {
		this.cmBoardDAO = cmBoardDAO;
	}


	@Override
	public void writeContent(CmBoard bto) throws SQLException {
		//1. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
				String writeDate = Utilities.getNow();
				String c = Utilities.changeContentForDB(bto.getContent());
				bto.setWritedate(writeDate);
				bto.setContent(c);
				//2. DAO를 이용해 글을 DB에 등록한다.
				cmBoardDAO.insertContentForNewCount(bto);
		
	}


	@Override
	public ArrayList<CmBoard> getBoardAllList() throws SQLException {
//		1. DAO의 메소드를 이용해 전체 글내용을 ArrayList로 조회
		ArrayList<CmBoard> list = cmBoardDAO.selectBoardAllList();
//		2. 조회한 ArrayList 안의 각 게시물들의 writedate를 yyyy.mm.dd 형태로 변경
		for(CmBoard cmBoard:list){
			cmBoard.setWritedate(Utilities.changeDayFormat(cmBoard.getWritedate()));
		}
		return list;
	}


	@Override
	public CmBoard getContentByNO(int no) throws SQLException {
		//1. DAO의 메소드를 이용해 조회수를 1 증가 시킨다.
				cmBoardDAO.updateViewCount(no);
				//2. DAO의 메소드를 이용해 글 정보 조회
				CmBoard cmBoard = cmBoardDAO.selectContentByNO(no);
				//3. 조회한 글 정보의 writedate를 yyyy.MM.dd HH:mm:ss 형식으로 변경 후 return
				cmBoard.setWritedate(Utilities.changeDayTimeFormat(cmBoard.getWritedate()));
				return cmBoard;
	}


	@Override
	public CmBoard getContentByNoForForm(int no) throws SQLException {
		//1. no값으로 글 조회
				CmBoard cmBoard = cmBoardDAO.selectContentByNO(no);
				//2. content를 textarea용으로 변경
				cmBoard.setContent(Utilities.changeContentForTextArea(cmBoard.getContent()));
				return cmBoard;
	}


	@Override
	public void modifyContent(CmBoard bto) throws SQLException {
//		1. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		bto.setContent(Utilities.changeContentForDB(bto.getContent()));
		bto.setWritedate(Utilities.getNow());
//		2. DAO 메소드를 이용해 수정 처리
		cmBoardDAO.updateContent(bto);
		
	}


	@Override
	public void deleteContentByNO(int no) throws SQLException {
		cmBoardDAO.deleteContentByNO(no);
		
	}


	@Override
	public void replyContent(CmBoard bto) throws SQLException {
//		1. DAO의 메소드를 이용해 DB에 같은 refamily의 게시물들 중 답변하고자하는 글의 restep 보다 큰 게시물들의 restep들을 1씩 증가시킨다.
		cmBoardDAO.updateRestep(bto.getRefamily(), bto.getRestep());
//		2. 등록하려는 게시물 데이터(매개변수로 받은 board)의 restep, relevel을 1 증가시킨다. - board가 가지고 있는 것은 원본글의 값이므로 자신의 값으로 변경하는 것.
		bto.setRestep(bto.getRestep()+1);
		bto.setRelevel(bto.getRelevel()+1);
//		3. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		bto.setWritedate(Utilities.getNow());
		bto.setContent(Utilities.changeContentForDB(bto.getContent()));
//		4. DAO의 메소드를 이용해 글을 DB에 넣는다.
		cmBoardDAO.insertContentForReply(bto);
		
	}


	@Override
	public Map getBoardListByPage(int page) throws SQLException {
		HashMap map = new HashMap();
//		1. DAO메소드를 이용해 매개변수로 받은 페이지에 보여줄 게시물들을 ArrayList로 조회
		System.out.println(page);
		ArrayList<CmBoard> list = cmBoardDAO.selectBoardListByPage(page);
		
//		2. 조회한 ArrayList 안의 각 게시물들의 writedate를 yyyy.mm.dd 형태로 변경
		for(CmBoard cmBoard:list){
			cmBoard.setWritedate(Utilities.changeDayFormat(cmBoard.getWritedate()));
		}
		map.put("list", list);
//		3. PagingBean객체를 생성 ( 필요 정보 : 전체 게시물의 개수, 보고자 하는 페이지 번호)
//		3-1 : DAO의 메소드를 이용해 전체 게시물 수 조회
		int totalContent = cmBoardDAO.selectTotalContent();
//		3-2 : PaginBean 객체 생성
		PagingBean pagingBean = new PagingBean(totalContent, page);
		map.put("pagingBean", pagingBean);
		return map;
	}


	@Override
	public ArrayList replyList() {
		return cmBoardDAO.replyList();
	}


	@Override
	public void addReply(ReCmBoard reCmBoard) {
		cmBoardDAO.addReply(reCmBoard);
		
	}


	@Override
	public ArrayList getReplyByNo(int no) {
		return cmBoardDAO.getReplyByNo(no);
	}
	
	//추천
	@Override
	public String recommend(RecommendTO rto) throws SQLException{
		 return cmBoardDAO.recommend(rto); 
	}
	@Override
	public void updateCommendCount(int no) throws SQLException{
		cmBoardDAO.updateCommendCount(no);
	}
	
	@Override
	public void insertRecommendInfo(RecommendTO rto) throws SQLException{
		cmBoardDAO.insertRecommendInfo(rto);
	}


	@Override
	public ArrayList mainList() {
		return cmBoardDAO.mainList();
	}


	@Override
	public ArrayList findTitle(String find) {
		return cmBoardDAO.findTitle(find);
	}


	@Override
	public ArrayList findWriter(String find) {
		return cmBoardDAO.findWriter(find);
	}
	
}
